/*

package cloud.xlh.interceptor;

import cloud.xlh.infrastructure.cache.redis.utils.RedisUtil;
import cloud.xlh.infrastructure.utils.CommonUtil;
import cloud.xlh.infrastructure.utils.StringUtil;
import cloud.xlh.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

*/
/**
 * Created with IntelliJ IDEA.
 *
 * @ project name : xlh_osms
 * @ Author: XuLeHuang
 * @ Date: 2022/5/27 16:23
 * @ Description: 幂等性处理
 *//*


@Component
public class IdempotentInterceptor implements HandlerInterceptor {

    // 注解的作用就是起一个标识的作用，使用拦截器可以拦截方法，然后方法可以获取到注解，判断注解上的方法是否是我们想要的注解，
    // 是：执行我们需要的逻辑；不是：注解放行或者拦截

    @Autowired
    private TokenService tokenService;

    @Value("${all-api-idempotent-handel}")
    private boolean allApiIdempotentHandel;

    @Value("${url.idempotentHandel.file.location}")
    private String urlLimitListFileLocation;

    @Autowired
    private RedisUtil redisUtil;

    private static final String URL_LIMIT_KEY = "urlLimitKey";
    private static final String LIMIT_FLAG = "1";

    //预处理回调方法，实现处理器的预处理（如检查登陆），第三个参数为响应的处理器，自定义Controller的方法对象
    //返回值：true表示继续流程（如调用下一个拦截器或处理器）；false表示流程中断（如登录检查失败），
    // 不会继续调用其他的拦截器或处理器，此时我们需要通过response来产生响应；
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // com.lkun.controller.IndexController#hello1()
        System.out.println(handler);
        // 思路：先把错误的情况全部排除
        writeCache();
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        */
/**
         * todo controller执行失败要将redis数据删除*//*

        if ((handler instanceof HandlerMethod) && ((HandlerMethod) handler).getBeanType().getSimpleName().equals("MyBasicErrorController")) {
            String clientIpAddress = CommonUtil.getIpAdrress(request);
            String token = request.getHeader("Token");
            redisUtil.del("xlh_osms-" + token + "-" + clientIpAddress);
            return true;
        }
        */
/**
         * 全量接口幂等性处理
         * or
         * 指定接口幂等性处理*//*

        if (allApiIdempotentHandel) {
            String uri = request.getRequestURI();
        } else {
            */
/*Idempotent idempotent = ((HandlerMethod) handler).getMethodAnnotation(Idempotent.class);
            if (idempotent == null) {
                return true;
            }*//*

            String requestURI = request.getRequestURI();
            boolean limitFlag = redisUtil.setIsMember(URL_LIMIT_KEY, requestURI);
            if (!limitFlag) {
                return true;
            }
        }
        // 获取到了方法上的注解，然后怎么办呢，我们就调用TokenService的验证方法，验证下，看是否符合条件
        return tokenService.checkToken(request);

    }

    */
/**
     * This implementation is empty.
     *//*


    // 在业务处理器处理请求完成之后，生成视图之前执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           @Nullable ModelAndView modelAndView) throws Exception {
        //解决controller无对应解析url判定为ResourceHttpRequestHandler出错
        if ((handler instanceof HandlerMethod)) {
            */
/*Idempotent idempotent = ((HandlerMethod) handler).getMethodAnnotation(Idempotent.class);
            if (idempotent != null) {
                tokenService.updateToken(request);
            }*//*

            String requestURI = request.getRequestURI();
            boolean limitFlag = redisUtil.setIsMember(URL_LIMIT_KEY, requestURI);
            if (limitFlag) {
                tokenService.updateToken(request);
            }
        }
    }

    */
/**
     * 仅在程序运行的时候执行一次
     * todo
     * 如何动态监听url列表文件的变化
     *//*

    public void writeCache() {
        List<String[]> limitUrlList = getLimitUrlList();
        limitUrlList.stream().forEach(var1 -> {
            String value = var1[0];
            redisUtil.setAdd(URL_LIMIT_KEY , value);
        });
    }

    */
/**
     * 逗号分隔
     *//*

    public List<String[]> getLimitUrlList() {
        List<String[]> list = StringUtil.readFromCsvFile("D:\\development\\environment\\idea\\IdeaProjects\\xlh_osms\\gateway\\src\\main\\resources\\urllimit\\list.csv");
        return list;
    }
}


*/
